package co.gov.medellin.sdep.sisdep.model.dao.impl;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.springframework.transaction.PlatformTransactionManager;

import co.gov.medellin.sdep.sisdep.common.AppConstants;
import co.gov.medellin.sdep.sisdep.common.OracleHelper;
import co.gov.medellin.sdep.sisdep.gestion.dto.VisitaAdministrativaDTO;
import co.gov.medellin.sdep.sisdep.model.VisitaAdministrativa;
import co.gov.medellin.sdep.sisdep.model.dao.VisitaAdministrativaDAOImpl;

//import co.gov.medellin.sdep.sisdep.model.VisitaAdministrativa;

public class VisitaAdministrativaDAOTImpl extends VisitaAdministrativaDAOImpl implements IVisitaAdministrativaDAOT {

	/** manejador de transacciones para VisitaAdministrativaDAOTImpl */
	private PlatformTransactionManager transactionManager;
	/**
	 * constructor por defecto
	 */
	public VisitaAdministrativaDAOTImpl() {
	}

	/**
	 * metodo ejemplo manejo de transacciones
	 */
	//public int updateRecordWithLog(VisitaAdministrativa visitaAdministrativa) {
	//	TransactionDefinition td = new DefaultTransactionDefinition();
	//	TransactionStatus status = getTransactionManager().getTransaction(td);
	//	try{
	//		llamado a metodos basicos en el DAO Base
	//		VisitaAdministrativaDAOImpl
	//		transactionManager.commit(status);
	//		
	//	}catch (Exception e){
	//		transactionManager.rollback(status);
	//		throw new RuntimeException(e);
	//	}
	//	return 0;
	//}

	/**
	 * retorna el transactionManager
	 * @return
	 */
	public PlatformTransactionManager getTransactionManager() {
		return transactionManager;
	}

	/**
	 * establece el transaction manager establecido en la configuracion
	 * @param transactionManager
	 */
	public void setTransactionManager(PlatformTransactionManager transactionManager) {
		this.transactionManager = transactionManager;
	}

	/* (non-Javadoc)
	 * @see co.gov.medellin.sdep.sisdep.model.dao.impl.IVisitaAdministrativaDAOT#getVisitAdminReport(co.gov.medellin.sdep.sisdep.model.VisitaAdministrativa)
	 */
	public VisitaAdministrativaDTO getVisitAdminReport(VisitaAdministrativa visitaAdministrativa) {
		
		StringBuffer query = new StringBuffer();
		
		query.append("SELECT DISTINCT VISADM.ID AS VISADM_ID, VISADM.FECHA_VISITA, SOLICI.ID SOLICI_ID, SOLICI.RADICADO, ");
		query.append("SOLICI.FECHA_RADICADO, VISADM.ID_TIPO_VISITA, VISADM.TIENE_HOJA_DE_VIDA, VISADM.ESE_DIGITAL, VISADM.REGULADO, ");
		query.append("VISADM.FECHA_VENCIMIENTO, VISADM.HORARIO, VISADM.OBSERVACIONES, SOLICI.DIRECCION_VENTA, ");
		query.append("SOLICI.BARRIO AS BARRIO_VENTA, SOLICI.COMUNA, PERSON.PRIMER_NOMBRE, ");
		query.append("PERSON.SEGUNDO_NOMBRE, PERSON.PRIMER_APELLIDO, PERSON.SEGUNDO_APELLIDO, ");
		query.append("PERSON.IDENTIFICACION, PERSON.DIRECCION_RESIDENCIA, PERSON.TELEFONO_RESIDENCIA, ");
		query.append("PERSON.NUMERO_CELULAR, PERSON.EMAIL, PERSON.BARRIO AS BARRIO_PERSONA ");
		query.append("FROM GES_VISITA_ADM_T VISADM ");
		query.append("INNER JOIN ADM_SOLICITUD_T SOLICI ON SOLICI.ID = VISADM.ID_SOLICITUD ");
		query.append("INNER JOIN ADM_PERSONA_T PERSON ON PERSON.ID = SOLICI.ID_PERSONA ");
		query.append("WHERE VISADM.ID = ? ");
		
		List params = new ArrayList();
		params.add(visitaAdministrativa.getId());
				
    	List rows = this.getJdbcTemplate().queryForList(query.toString(), params.toArray());
		
    	VisitaAdministrativaDTO visitaAdministrativaDTO = new VisitaAdministrativaDTO();
    	Iterator iterator = rows.iterator();
    	
    	while (iterator.hasNext()) {
    		Map visitAdminMap = (Map) iterator.next();
    		
    		visitaAdministrativaDTO.setIdVisita(((BigDecimal) visitAdminMap.get("VISADM_ID")).toString());
			visitaAdministrativaDTO.setIdSolicitud(((BigDecimal) visitAdminMap.get("SOLICI_ID")).toString());
			visitaAdministrativaDTO.setFechaVisita(OracleHelper.timeStamp2string((Timestamp) visitAdminMap.get("FECHA_VISITA")));
			visitaAdministrativaDTO.setRadicado((String) visitAdminMap.get("RADICADO"));
			visitaAdministrativaDTO.setFechaRadicado(OracleHelper.timeStamp2string((Timestamp) visitAdminMap.get("FECHA_RADICADO")));
			visitaAdministrativaDTO.setTipoVisita(((BigDecimal) visitAdminMap.get("ID_TIPO_VISITA")).toString());//OJO PREGUNTAR A JULIAN POR CAMPO NOT NULL
			
			if (visitAdminMap.get("TIENE_HOJA_DE_VIDA") != null) {
				visitaAdministrativaDTO.setHojaVida(visitAdminMap.get("TIENE_HOJA_DE_VIDA").toString());
			}
			
			if (visitAdminMap.get("ESE_DIGITAL") != null) {
				visitaAdministrativaDTO.setEseDigital(visitAdminMap.get("ESE_DIGITAL").toString());
			}
			
			visitaAdministrativaDTO.setNombreCompleto((String) visitAdminMap.get("PRIMER_NOMBRE"));
			
			if (visitAdminMap.get("SEGUNDO_NOMBRE") != null) {
				visitaAdministrativaDTO.setNombreCompleto(visitaAdministrativaDTO.getNombreCompleto()
						.concat(AppConstants.BLANK).concat((String) visitAdminMap.get("SEGUNDO_NOMBRE")));
			}
			
			visitaAdministrativaDTO.setNombreCompleto(visitaAdministrativaDTO.getNombreCompleto()
					.concat(AppConstants.BLANK).concat((String) visitAdminMap.get("PRIMER_APELLIDO")));
			
			if (visitAdminMap.get("SEGUNDO_APELLIDO") != null) {
				visitaAdministrativaDTO.setNombreCompleto(visitaAdministrativaDTO.getNombreCompleto()
						.concat(AppConstants.BLANK).concat((String) visitAdminMap.get("SEGUNDO_APELLIDO")));
			}
			
			visitaAdministrativaDTO.setCedula((String) visitAdminMap.get("IDENTIFICACION"));
			visitaAdministrativaDTO.setDireccionPersona((String) visitAdminMap.get("DIRECCION_RESIDENCIA"));
			visitaAdministrativaDTO.setTelefono((String) visitAdminMap.get("TELEFONO_RESIDENCIA"));
			
			if (visitAdminMap.get("NUMERO_CELULAR") != null) {
				visitaAdministrativaDTO.setCelular((String) visitAdminMap.get("NUMERO_CELULAR"));
			}
				
			if (visitAdminMap.get("EMAIL") != null) {
				visitaAdministrativaDTO.setEmail((String) visitAdminMap.get("EMAIL"));
			}
			
			visitaAdministrativaDTO.setBarrioPersona((String) visitAdminMap.get("BARRIO_PERSONA"));
			
			if (visitAdminMap.get("REGULADO") != null) {
				visitaAdministrativaDTO.setRegulado((String) visitAdminMap.get("REGULADO"));
			}
			
			if (visitAdminMap.get("FECHA_VENCIMIENTO") != null) {
				visitaAdministrativaDTO.setFechaVencimiento(OracleHelper.timeStamp2string((Timestamp) visitAdminMap.get("FECHA_VENCIMIENTO")));
			}
			
			visitaAdministrativaDTO.setDireccionVenta((String) visitAdminMap.get("DIRECCION_VENTA"));
			visitaAdministrativaDTO.setBarrioVenta((String) visitAdminMap.get("BARRIO_VENTA"));
			visitaAdministrativaDTO.setComunaVenta((String) visitAdminMap.get("COMUNA"));
			
			if (visitAdminMap.get("HORARIO") != null) {
				visitaAdministrativaDTO.setHorario((String) visitAdminMap.get("HORARIO"));
			}
			
			// OJO CAMPOS PENDIENTES DE ANALISIS EN DISENO DE QUE TABLA SE OBTENDRAN
//			visitaAdministrativaDTO.setTipologia((String) moduloMap.get(""));
//			visitaAdministrativaDTO.setAmoblamiento((String) moduloMap.get(""));
//			visitaAdministrativaDTO.setClaseVenta((String) moduloMap.get(""));
//			visitaAdministrativaDTO.setConcepto((String) moduloMap.get(""));
//			visitaAdministrativaDTO.setModulo((String) moduloMap.get(""));
//			visitaAdministrativaDTO.setContratoHacienda((String) moduloMap.get(""));
//			visitaAdministrativaDTO.setActaEntrega((String) moduloMap.get(""));

			visitaAdministrativaDTO.setObservaciones((String) visitAdminMap.get("OBSERVACIONES"));
			
//			visitaAdministrativaDTO.setRegistroGraficoSector((String) moduloMap.get(""));
//			visitaAdministrativaDTO.setRegistroFotograficoSector((String) moduloMap.get(""));
    	}
		
		return visitaAdministrativaDTO;
	}

}
